package com.example.service;

import com.example.mapper.MedicalMapper;
import com.example.pojo.*;
import com.example.utils.JwtUtils;
import com.example.utils.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
public class MedicalService {
    @Autowired
    private MedicalMapper medicalMapper;
    public List<DrugVo> getList(ConditionsQuery conditionsQuery) {
        List<DrugVo>list=medicalMapper.getList(conditionsQuery);
        if (list!=null && list.size()>0){
            for (DrugVo drugVo:list){
                List<Sale> saleList=medicalMapper.getSaleLocations(drugVo.getDrug_id());
                if (saleList!=null && saleList.size()>0){

                    String temp="";
                    String saleIds="";
                    for(int i=0;i<saleList.size();i++){
                        if(i<saleList.size()-1){
                            temp+=saleList.get(i).getSale_name()+",";
                            saleIds+=saleList.get(i).getSale_id()+",";
                        }else{
                            temp+=saleList.get(i).getSale_name();
                            saleIds+=saleList.get(i).getSale_id();
                        }
                    }
                    drugVo.setSaleLocation(temp);
                    drugVo.setSaleIds(saleIds);
                }
            }
        }
        return list;
    }

    public List<Sale> getSaleList() {
        List<Sale> saleList=medicalMapper.getSaleList();
        return saleList;
    }

    public Result add(Drug drug, List<Integer> saleIds, String token) {
        // 从Redis获取token
        String redisToken = RedisUtil.get("medical:login:token");

        // token的校验
        if (!StringUtils.hasText(token) || !StringUtils.hasText(redisToken)) {
            return new Result(101, "token为空", null);
        }
        if (!token.equals(redisToken)) {
            return new Result(101, "token不合法", null);
        }

        if (saleIds==null || saleIds.size()<1){
            return new Result(100, "请至少选择一个销售地点", null);
        }
        // 校验其他参数
        //校验药品名称是否存在
        Drug d=medicalMapper.getDrugByName(drug.getDrug_name());

        if (d!=null){
            return new Result(100, "药品已存在", null);
        }
        // 添加药品信息
        // 添加药品信息
        drug.setCreatetime(new Date());
        drug.setUpdatetime(new Date());

        // 从JWT令牌中获取发布者的用户名
        String uname = JwtUtils.getMemberNameByJwtToken(token);
        if (uname == null) {
            // 如果无法从令牌中获取用户名，返回相应的错误信息
            return new Result(104, "无法获取发布者信息", null);
        }

        drug.setPublisher(uname);

        // 将drug对象存储到数据库
        try {
            int row=medicalMapper.insert(drug);
            System.err.println(drug);
            if(row!=1){
                return new Result(100, "操作失败", null);
            }
            System.err.println(saleIds);
            for (Integer saleid:saleIds){
                int res=medicalMapper.insertDrugSale(drug.getDrug_id(),saleid);
                if (res!=1){
                    return new Result(100, "操作失败", null);
                }
            }
            return new Result(200, "药品添加成功", drug);
        } catch (Exception e) {
            // 记录异常信息，实际应用中可能需要更详细的异常处理
            // logger.error("Error adding drug", e);
            return new Result(500, "服务器内部错误", null);
        }


    }

    public Result edit(Drug drug, List<Integer> saleIds, String token) {
        // 从Redis获取token
        String redisToken = RedisUtil.get("medical:login:token");

        // token的校验
        if (!StringUtils.hasText(token) || !StringUtils.hasText(redisToken)) {
            return new Result(101, "token为空", null);
        }
        if (!token.equals(redisToken)) {
            return new Result(101, "token不合法", null);
        }

        if (saleIds==null || saleIds.size()<1){
            return new Result(100, "请至少选择一个销售地点", null);
        }

        drug.setUpdatetime(new Date());

        // 从JWT令牌中获取发布者的用户名
        String uname = JwtUtils.getMemberNameByJwtToken(token);
        if (uname == null) {
            // 如果无法从令牌中获取用户名，返回相应的错误信息
            return new Result(104, "无法获取发布者信息", null);
        }
        drug.setPublisher(uname);
        //获取drug_id 的数据数
        int count =medicalMapper.getDrugSaleById(drug.getDrug_id());
        //drug_sale表数据删除 drug_id
        int row=medicalMapper.delAllDataFromDrugSaleById(drug.getDrug_id());
        //数据不对
        if(row!=count){
            return new Result(100, "操作失败", null);
        }
        //更新销售地点
        // 更新关联记录为新的 saleIds 列表
        int insertedRows = 0;
        for (Integer saleId : saleIds) {
            if (medicalMapper.insertDrugSale(drug.getDrug_id(),saleId) > 0) {
                insertedRows++;
            }
        }
        //更新的数据不对
        if (insertedRows!=saleIds.size()){
            return new Result(100, "操作失败", null);
        }
        //最后更新drug表数据
        row=medicalMapper.updateDrug(drug);
        if(row!=1){
            return new Result(100, "操作失败", null);
        }
        return new Result(200, "修改成功", null);
    }

    public Result delDrugById(String id, String token) {

        // 从JWT令牌中获取发布者的用户名
        String uname = JwtUtils.getMemberNameByJwtToken(token);
        if (uname == null) {
            // 如果无法从令牌中获取用户名，返回相应的错误信息
            return new Result(104, "无法获取发布者信息", null);
        }
        //先删除drug_sale表数据
        //获取drug_id 的数据数
        int count =medicalMapper.getDrugSaleById(Integer.parseInt(id));
        //drug_sale表数据删除 drug_id
        int row=medicalMapper.delAllDataFromDrugSaleById(Integer.parseInt(id));
        //数据不对
        if(row!=count){
            return new Result(100, "操作失败", null);
        }
        //删除drug表数据
        row=medicalMapper.delDrugById(Integer.parseInt(id));
        if(row!=1){
            return new Result(100, "操作失败", null);
        }
        return new Result(200, "删除成功", null);
    }

    public Result delBatch(String ids, String token) {
        // 从JWT令牌中获取发布者的用户名
        String uname = JwtUtils.getMemberNameByJwtToken(token);
        if (uname == null) {
            // 如果无法从令牌中获取用户名，返回相应的错误信息
            return new Result(104, "无法获取发布者信息", null);

        }
        if (!StringUtils.hasText(ids)){
            return new Result(100,"请至少选择一条记录",null);
        }

        String[] idStr =ids.split(",");

        List<Integer> idList=new ArrayList<>();

        for (int i=0; i<idStr.length;i++){
            idList.add(Integer.parseInt(idStr[i]));
            //先删除drug_sale表数据
            //获取drug_id 的数据数
            int count =medicalMapper.getDrugSaleById(Integer.parseInt(idStr[i]));
            //drug_sale表数据删除 drug_id
            int row=medicalMapper.delAllDataFromDrugSaleById(Integer.parseInt(idStr[i]));
            //数据不对
            if(row!=count){
                return new Result(100, "操作失败", null);
            }
        }
        int rows =medicalMapper.delBatch(idList);
        if(rows!=idList.size()){
            return new Result(100,"操作失败",null);
        }
        return new Result(200,"删除成功",null);
    }

    public Result getMarker() {
        List<Sale> saleList=medicalMapper.getSaleList();
        List<Marker> markerList= new ArrayList<>();
        for (Sale sale: saleList){
            Double[] position = {sale.getLng(), sale.getLat()};
            String name = sale.getSale_name();
            Marker m=new Marker();
            m.setPosition(position);
            m.setName(name);
            //m.setIcon("http://localhost:8082/posIcon.png");
            markerList.add(m);
        }
        return new Result(200,"数据加载成功",markerList);
    }
}
